/**
 * 
 */
package ar.com.jsejtman.cajugastos2.view.controller;

import ar.com.jsejtman.cajugastos2.core.entity.Mes;
import ar.com.jsejtman.cajugastos2.view.dto.GastoDTO;
import ar.com.jsejtman.common.service.data.DataPage;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

/**
 * http://krams915.blogspot.com/2010/12/jqgrid-and-spring-3-mvc-integration.html
 * 
 * Controller que maneja las acciones de gastos.
 * 
 * @author jsejtman
 * 
 */
@Controller
@RequestMapping("/gastos")
public class GastoController {

	/**
	 * Logger.
	 */
	private static final Logger LOGGER = LoggerFactory.getLogger(GastoController.class);

	/**
	 * Acción mes previo.
	 */
	private static final String ACTION_PREV_MONTH = "prevMonth";

	/**
	 * Acción mes siguiente.
	 */
	private static final String ACTION_NEXT_MONTH = "nextMonth";

	/**
	 * Método que procesa el ingreso a ver gastos.
	 * 
	 * @param model model.
	 * @return ModelAndView.
	 */
	@RequestMapping(value = "/ver", method = RequestMethod.GET)
	public final ModelAndView verGastos(final ModelMap model) {

		GastoController.LOGGER.debug("verGastos");
		final Calendar c = Calendar.getInstance();
		model.addAttribute("verGastosMesActual", Mes.fromCode(c.get(Calendar.MONTH)));
		model.addAttribute("verGastosAnioActual", c.get(Calendar.YEAR));
		return new ModelAndView("ver-gastos", model);
	}

	/**
	 * Método que procesa el ingreso a ver gastos.
	 * 
	 * @param accion accion.
	 * @param mesActual mes actual.
	 * @param anioActual mes actual.
	 * @param model model.
	 * @return ModelAndView.
	 */
	@RequestMapping(value = "/ver", method = RequestMethod.POST)
	public final ModelAndView verGastosOtroMes(@RequestParam final String accion,
	        @RequestParam final String mesActual, @RequestParam final String anioActual,
	        final ModelMap model) {

		GastoController.LOGGER.debug("verGastosOtroMes - accion: " + accion + " - "
		        + "Mes actual: " + mesActual + " - " + "Anio actual: " + anioActual);
		final Calendar c = Calendar.getInstance();
		try {
			final int iMesActual = Integer.parseInt(mesActual);
			final int iAnioActual = Integer.parseInt(anioActual);

			c.set(Calendar.MONTH, iMesActual);
			c.set(Calendar.YEAR, iAnioActual);
			if (GastoController.ACTION_NEXT_MONTH.equals(accion)) {
				c.add(Calendar.MONTH, 1);
			} else if (GastoController.ACTION_PREV_MONTH.equals(accion)) {
				c.add(Calendar.MONTH, -1);
			}
			model.addAttribute("verGastosMesActual", Mes.fromCode(c.get(Calendar.MONTH)));
			model.addAttribute("verGastosAnioActual", c.get(Calendar.YEAR));
		} catch (final NumberFormatException nfe) {
			GastoController.LOGGER.debug("Error al parsear el numero de mes", nfe);
			model.addAttribute("verGastosMesActual", Mes.fromCode(c.get(Calendar.MONTH)));
			model.addAttribute("verGastosAnioActual", c.get(Calendar.YEAR));
		}

		return new ModelAndView("ver-gastos", model);
	}

	/**
	 * Método que procesa el ingreso a ver gastos.
	 * 
	 * @return ModelAndView.
	 */
	@RequestMapping(value = "/cargar", method = RequestMethod.GET)
	public final ModelAndView cargarGastos() {

		GastoController.LOGGER.debug("cargarGastos");
		return new ModelAndView("cargar-gastos");
	}

	/* CHECKSTYLE:OFF */
	/**
	 * Carga los gastos del mes para alimentar la tabla de gastos.
	 * 
	 * @param model model.
	 * @return el objeto wrapper de resultados a ser encodeado en json.
	 */
	@RequestMapping(value = "/cargarDatos")
	@ResponseBody
	public final DataPage<GastoDTO> getGastosDelMes(final ModelMap model) {

		GastoController.LOGGER.debug("verGastosOtroMes - accion: ");

		final DataPage<GastoDTO> gastos = new DataPage<GastoDTO>();

		gastos.setPage(1);
		gastos.setLimit(10);
		gastos.setRecords(30);
		gastos.setTotal(2);

		gastos.setRows(new ArrayList<GastoDTO>());
		final Calendar c = Calendar.getInstance();
		c.set(Calendar.DAY_OF_MONTH, 1);
		c.set(Calendar.MONTH, 12);
		c.set(Calendar.YEAR, 2011);
		gastos.getRows().add(
		        new GastoDTO(1l, c.getTime(),
		                "Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 "
		                        + "Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 "
		                        + "Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 Gasto 1 "
		                        + "Gasto 1 Gasto 1 Gasto 1", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		c.set(Calendar.DAY_OF_MONTH, 2);
		gastos.getRows().add(
		        new GastoDTO(2l, c.getTime(), "Gasto 2", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(3l, c.getTime(), "Gasto 3", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(4l, c.getTime(), "Gasto 4", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(5l, c.getTime(), "Gasto 5", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(6l, c.getTime(), "Gasto 6", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(7l, c.getTime(), "Gasto 7", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(8l, c.getTime(), "Gasto 8", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(9l, c.getTime(), "Gasto 9", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(10l, c.getTime(), "Gasto 10", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(11l, c.getTime(), "Gasto 11", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(12l, c.getTime(), "Gasto 12", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(13l, c.getTime(), "Gasto 13", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(14l, c.getTime(), "Gasto 14", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(15l, c.getTime(), "Gasto 15", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(16l, c.getTime(), "Gasto 16", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(17l, c.getTime(), "Gasto 17", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(18l, c.getTime(), "Gasto 18", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(19l, c.getTime(), "Gasto 19", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));
		gastos.getRows().add(
		        new GastoDTO(20l, c.getTime(), "Gasto 20", new BigDecimal("10.40"), "Mensual",
		                "Comida", "Delivery", "Centro"));

		return gastos;
	}

	/* CHECKSTYLE:ON */
}
